#include "ProcessPool.hpp"

int main()
{
    int k = 0;
    ProcessPool master; // 创建一个进程池，用来管理所有匿名管道
    // 1.创建K个匿名管道
    std::cout << "输入想创建的管道数量：";
    fflush(stdout);
    std::cin >> k;
    master.add_channel(k, [](int fd0, int fd1)
                       {
                close(fd1);
                char buff[1024] = {0};
                while (true)
                { // 子进程作为读端接收信息
                    buff[0] = '\0';
                    int i = read(fd0, buff, 1023);
                    if (i > 0)
                    { // 子进程接收到父进程的信息，开始执行任务
                        buff[i] = '\0';
                        std::cout << buff << '/' << getpid() << ':' << std::endl;
                        long long pid = getpid();
                        task.Task_select(rand()*pid); // 随机执行任务
                    }
                    else if (i == 0)
                    {
                        std::cout << "写端已关闭,me too" << '/' << "子进程：" << getpid() << std::endl;
                        break;
                    }
                }
                exit(0); });

    // 2.父进程作为写端，发送信息
    std::cout << "进程池中各频道内容：\n";
    master.processpool_print();
    std::cout << "输入父进程想发送的信息条数：";
    fflush(stdout);
    std::cin >> k;
    getchar(); // 读取输入缓存区遗留的'\n'
    master.channel_write(k);

    // 3.回收子进程
    sleep(1);
    std::cout << "父进程发送信息次数用尽,关闭写端" << std::endl;
    for (int j = 0; j < master.ret_processnum(); j++)
    {
        master.close_wfd(j);
        master.wait_process(j);
        sleep(1);
    }
    std::cout << "回收子进程成功" << std::endl;
    return 0;
}